{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Introduction\n",
    "\n",
    "The quantum Fourier transform and quantum phase estimation provide the foundation for many quantum algorithms, including the quantum matrix inversion, which is extensively used in quantum machine learning. It is therefore worthwhile developing a good understanding of these building blocks before moving on to more complex algorithms.\n",
    "\n",
    "We must emphasize that starting with this notebook, the algorithms presented are coherent quantum protocols. By that, we mean that the input and output of an algorithm is a quantum state that we do not have classical information about. The protocol itself might use measurements: in this sense, they are not fully coherent, since we gain some, but incomplete classical information about the quantum system. We might also perform post-selection, which means that a gate is controlled by the classical output of a measurement. In some cases, we entirely discard a calculation based on a measurement output.\n",
    "\n",
    "Why does it matter that we begin and end up with quantum states? Can't we just use state preparation starting from classical data and then perform tomography on the final state? We could do that, but state preparation and tomography are resource-intensive, and they are likely to destroy any quantum advantage.\n",
    "\n",
    "An additional problem is that the quantum Fourier transformation and other quantum algorithms similar in complexity require a very large number of gates on a large number of high-quality qubits. This is why the practical relevance of these algorithms is not immediate, but since they are the core of many quantum machine learning protocols, it is essential that we take a look at them."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/pwittek/.anaconda3/envs/qiskit/lib/python3.7/site-packages/marshmallow/schema.py:364: ChangedInMarshmallow3Warning: strict=False is not recommended. In marshmallow 3.0, schemas will always be strict. See https://marshmallow.readthedocs.io/en/latest/upgrading.html#schemas-are-always-strict\n",
      "  ChangedInMarshmallow3Warning\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "from qiskit import QuantumCircuit, ClassicalRegister, QuantumRegister\n",
    "from qiskit import execute\n",
    "from qiskit import BasicAer\n",
    "π = np.pi"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Quantum Fourier Transform\n",
    "\n",
    "The quantum Fourier transform is a quantum algorithm for the discrete Fourier transform over the amplitudes of a wavefunction. The exposition here follows the introduction in [[1](#1)]. A similar approach can be found in the [Qiskit tutorials](https://github.com/Qiskit/qiskit-tutorials/blob/master/community/algorithms/shor_algorithm.ipynb).\n",
    "\n",
    "The classical discrete Fourier transform acts on a vector $\\vec{x}=\\begin{bmatrix}x_0\\\\ \\vdots\\\\ x_{N-1}\\end{bmatrix}$ and maps it to the vector $\\vec{y}=\\begin{bmatrix}y_0\\\\ \\vdots\\\\ y_{N-1}\\end{bmatrix}$, where $y_k = \\frac{1}{\\sqrt{N}}\\sum_{j=0}^{N-1}x_je^{ \\boldsymbol{2\\pi i} \\frac{jk}{N}}$.\n",
    "\n",
    "The quantum Fourier transform acts on an amplitude-encoded variant of this vector, the quantum state $|x\\rangle=\\sum_{i=0}^{N-1} x_i |i \\rangle$ and maps it to the quantum state $|y\\rangle=\\sum_{k=0}^{N-1} y_k |k \\rangle$, where\n",
    "$y_k = \\frac{1}{\\sqrt{N}}\\sum_{j=0}^{N-1}x_je^{\\boldsymbol{2\\pi i} \\frac{jk}{N}}$. Since the transformed state is also in the superposition of the computational basis, in essence, only the amplitudes are transformed.\n",
    "\n",
    "To derive a circuit for a power of two $N=2^n$, consider the transform acts on the state $| x \\rangle = | x_1...x_n \\rangle$ where $x_1$ is the most significant bit, unlike the usual convention followed in the course. We will rewrite a number $y$ in the fractional binary notation  as $j = 0.j_1...j_n = \\sum_{k=1}^n j_k/2^k$. For example $0.8125_d = 0.1101_b = \\sum_{k=1}^4 j_k/2^k = 1/2 + 1/4 + 0/8 + 1/16$, where the subscripts $d$ stands for decimal and $b$ for binary. The action of the unitary $U$ describing the transform can be expanded as\n",
    "\\begin{aligned}\n",
    "U |x \\rangle = U |x_1 x_2 \\cdots x_n \\rangle& = \\frac{1}{\\sqrt{N}} \\sum_{k=0}^{2^n-1} e^{\\boldsymbol{2\\pi i} xk / 2^n} |k \\rangle \\\\\n",
    "& = \\frac{1}{\\sqrt{N}} \\sum_{k_1=0}^{1}\\ldots\\sum_{k_n=0}^{1} e^{\\boldsymbol{2\\pi i} x\\left(\\sum_{l=1}^n k_l2^{-l}\\right) } \\vert k_1 ... k_n \\rangle \\\\\n",
    "& = \\frac{1}{\\sqrt{N}} \\sum_{k_1=0}^{1}\\ldots\\sum_{k_n=0}^{1} \\bigotimes_{l=1}^n e^{\\boldsymbol{2\\pi i} x k_l2^{-l}} | k_1 ... k_n \\rangle \\\\\n",
    "& = \\frac{1}{\\sqrt{N}} \\bigotimes_{l=1}^n \\sum_{k_l=0}^{1}  e^{\\boldsymbol{2\\pi i} x k_l2^{-l}} | k_1 ... k_n \\rangle \\\\\n",
    "& = \\frac{1}{\\sqrt{N}} \\bigotimes_{l=1}^n  \\left(|0\\rangle + e^{\\boldsymbol{2\\pi i} x 2^{-l} } |1\\rangle \\right) \\\\\n",
    "& = \\frac{1}{\\sqrt{N}} \\left(|0\\rangle + e^{\\boldsymbol{2\\pi i} 0.x_n} |1\\rangle\\right) \\otimes...\\otimes  \\left(\\vert0\\rangle + e^{\\boldsymbol{2\\pi i} 0.x_1.x_2...x_{n-1}.x_n} |1\\rangle\\right) \n",
    "\\end{aligned}\n",
    "\n",
    "This form of the QFT is useful for deriving a circuit, since only the last qubit depends on the the\n",
    "values of all the other input qubits. The remaining qubits depend less and less on the input qubits. The simple structure also allows to decompose the unitary as Hadamard gates and rotations. On three qubits, we can define the circuit as follows:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "q = QuantumRegister(3, 'q')\n",
    "c = ClassicalRegister(1, 'c')\n",
    "qft = QuantumCircuit(q, c)\n",
    "qft.h(q[0])\n",
    "qft.cu1(π/2, q[1], q[0])\n",
    "qft.h(q[1])\n",
    "qft.cu1(π/4, q[2], q[0])\n",
    "qft.cu1(π/2, q[2], q[1])\n",
    "qft.h(q[2]);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can plot it to make the qubit dependencies more apparent:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/pwittek/.anaconda3/envs/qiskit/lib/python3.7/site-packages/qiskit/tools/visualization/_circuit_visualization.py:206: DeprecationWarning: The current behavior for the default output will change in a future release. Instead of trying latex and falling back to mpl on failure it will just use \"text\" by default\n",
      "  '\"text\" by default', DeprecationWarning)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<PIL.Image.Image image mode=RGB size=441x175 at 0x7FBD788C1F98>"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from qiskit.tools.visualization import circuit_drawer\n",
    "circuit_drawer(qft)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The conditional rotations dominate the complexity, which scales as $O(N^2)$."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Quantum phase estimation\n",
    "\n",
    "The quantum phase estimation algorithm estimates the phase of a unitary operator $U$, that is, it estimates $\\theta$ in  $U|\\psi \\rangle =e^{\\boldsymbol{2\\pi i} \\theta }|\\psi \\rangle$. Here $|\\psi\\rangle$ is an eigenvector and $e^{\\boldsymbol{2\\pi i}\\theta}$ is the corresponding eigenvalue. Since $U$ is unitary, all of its eigenvalues have an absolute value of 1.\n",
    "\n",
    "The $|\\psi\\rangle$ is in one set of qubit registers. An additional set of $n$ qubits form an ancilla register. A critical element is the ability to perform the controlled unitary $C-U^{2^k}$ -- it is usually assumed that it is provided to the phase estimation protocol.\n",
    "\n",
    "First, the uniform superposition is prepared in the ancilla register via the application of Hadamard gates $H$. These qubits will act as controls for the unitary operators at different time steps. Our goal is to create a superposition of $U$ as the unitary is applied for different durations. Since the eigenvalues are always situated on the complex unit circle, these differently evolved components in the superposition help reveal the eigenstructure. Given that the ancilla register we have a superposition of all possible time steps between $0$ and $2^{n-1}$, we will end up with a superposition of all possible evolutions to encode binary representations of the eigenvalues. At the end of this procedure, we have the state \n",
    "\\begin{aligned}\n",
    "& \\frac {1}{2^{\\frac {n}{2}}} (|0\\rangle+{e^{\\boldsymbol{2\\pi i} \\theta 2^{n-1}}}|1\\rangle ) \\otimes \\cdots (|0\\rangle+{e^{\\boldsymbol{2\\pi i} \\theta 2^{1}}}|1\\rangle ) \\otimes (|0\\rangle+{e^{\\boldsymbol{2\\pi i} \\theta 2^{0}}}|1\\rangle ) = \\\\\n",
    "&\\frac {1}{2^{\\frac {n}{2}}}\\sum _{k=0}^{2^{n}-1}e^{\\boldsymbol{2\\pi i} \\theta k}|k\\rangle\n",
    "\\end{aligned}\n",
    "in the ancilla. To write the ancilla in this form, we exploit that the controlled unitary operations when applied, introduce a global phase, and it is this global phase that we see in the ancilla. This phenomenon is also known as the phase kickback.\n",
    "\n",
    "As a final step, we apply an inverse Fourier transform on the ancilla. Measuring out in the computational basis, we get the phase in the ancilla register:\n",
    "\n",
    "\\begin{align}\n",
    "\\frac {1}{2^{\\frac {n}{2}}}\\sum _{k=0}^{2^{n}-1}e^{\\boldsymbol{2\\pi i} \\theta k}|k\\rangle \\otimes | \\psi \\rangle \\xrightarrow{\\mathcal{QFT}_n^{-1}} | 2^n \\theta \\rangle \\otimes | \\psi \\rangle\n",
    "\\end{align}\n",
    "\n",
    "The circuit for phase estimation is the following:\n",
    "\n",
    "![Quantum phase estimation](figures/qpe.svg)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As an example, let us take a $2\\times 2$ unitary matrix that is defined via the Hamiltonian $\\frac{1}{2}\\begin{bmatrix}3 & 1 \\\\1 & 3\\end{bmatrix}$, which has eigenvectors of powers of two. Starting with $|\\psi\\rangle=|0\\rangle$ in the main register, we prepare the superposition in the ancilla:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "qpe = QuantumCircuit(q, c)\n",
    "qpe.h(q[0])\n",
    "qpe.h(q[1]);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Next we perform the controlled unitary operations:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Controlled-U0\n",
    "qpe.cu3(-π / 2, -π / 2, π / 2, q[1], q[2])\n",
    "qpe.cu1(3 * π / 4, q[1], q[2])\n",
    "qpe.cx(q[1], q[2])\n",
    "qpe.cu1(3 * π / 4, q[1], q[2])\n",
    "qpe.cx(q[1], q[2])\n",
    "# Controlled-U1\n",
    "qpe.cx(q[0], q[2]);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We apply quantum inverse Fourier transformation to write the phase to the ancilla register:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "qpe.swap(q[0], q[1])\n",
    "qpe.h(q[1])\n",
    "qpe.cu1(-π / 2, q[0], q[1])\n",
    "qpe.h(q[0]);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Finally, we can plot the circuit:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/pwittek/.anaconda3/envs/qiskit/lib/python3.7/site-packages/qiskit/tools/visualization/_circuit_visualization.py:206: DeprecationWarning: The current behavior for the default output will change in a future release. Instead of trying latex and falling back to mpl on failure it will just use \"text\" by default\n",
      "  '\"text\" by default', DeprecationWarning)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<PIL.Image.Image image mode=RGB size=965x208 at 0x7FBD788C6B70>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "circuit_drawer(qpe)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# References\n",
    "[1] M. Nielsen, I. Chuang. (2000). *Quantum Computation and Quantum Information*. Cambridge University Press. <a id='1'></a>"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
